package com.jketing.service.ams.sys;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jketing.entity.ams.sys.Account;
import com.jketing.entity.ams.sys.Role;
import com.jketing.repository.BaseRepository;
import com.jketing.repository.ams.sys.AccountRepository;
import com.jketing.repository.ams.sys.RoleRepository;
import com.jketing.service.BaseService;


/**
 * AccountService	账号服务类
 * 	功能：
 * 		继承扩展服务基类实现子类特有方法及功能；
 * 		如：多表查询和多表操作等；
 * 		可注入其它实体的仓库类或使用jdbc实现Dao调用本地Sql进行多表查询
 * 
 * @author  李荣华
 * @version v1.0
 * @date    2017-12-24
 * @since   Spring-data 1.11.4
 */
@Service
public class AccountService extends BaseService<Account,String> {
	
	/**
	 * repository String按IOC容器管理的Bean类型自动注入模块仓库操作实例 .
	 */
	@Autowired
	private AccountRepository repository;
	/**
	 * repository String按IOC容器管理的Bean类型自动注入模块仓库操作实例 .
	 */
	@Autowired
	private RoleRepository roleRepository;
	
	/**
	 * String按IOC容器管理的Bean名称自动注入服务基类的仓库操作实例
	 * 	 
	 * @param BaseRepository<Function,String> repository
	 * 
	 * @return void
	 */
	@Resource(name="accountRepository")
	public void setBaseRepository(BaseRepository<Account,String> repository) {
		super.setBaseRepository(repository);
	}
	
	public Account getAccountByLoginName(String loginName) {
		return repository.findByLoginNameOrMobileOrEmail(loginName,loginName,loginName);
	}
	
	/**
	 * getRoleIds 取角色id串
	 * 
	 * @param id  PK
	 * 
	 * @return List<String> 字符串数组
	 */
	private List<String> getRoleIds(String id){
		Account entity = repository.findOne(id);	
		List<String> result = new ArrayList<String>();
		if(entity.getRoles().size() > 0){
			for(Role item : entity.getRoles()){
				result.add(item.getId());
			}	
		}
		return result;
	}
	
	/**
	 * getRoles 取当前账号的角色列表
	 * 
	 * @param id  账号PK
	 * 
	 * @return List<Role> 返回角色列表
	 */
	public List<Role> getRoles(String id) {
		List<Role> list = new ArrayList<Role>();		
		Account entity = repository.findOne(id);		
		for(Role item : entity.getRoles()){
			list.add(item);
		}
		return list;
	} 
	
	/**
	 * 新增时调用的save方法
	 * 
	 * @param entity  要保存的实体对象
	 * @param ids 角色id串，以','隔开
	 * 
	 *  @return 返回保存后的对象
	 */
	public Account save(Account entity, String ids) {
		entity.setId(getTimeId());
		entity.setJoinTime(new Date());
		entity.setUseable("true");
		entity.setPassword(encrypt(entity.getPassword(), entity.getId()));
		String[] array = ids.split(",");
		for(String id:array) {
			Role role = roleRepository.getOne(id);
			entity.add(role);
			entity.setDefaultRole(role);
		}
		return repository.save(entity);
	}
	
	/**
	 * 更新时调用的update方法
	 * 
	 * @param entity  要更新的实体对象
	 * @param ids 角色id串，以','隔开
	 * 
	 *  @return 返回更新后的对象
	 */
	public Account update(Account entity,String ids) {
		List<String> originalIds = getRoleIds(entity.getId());
		Account object = repository.findOne(entity.getId());			
		//删除原来的所在部门关系
		for(String id:originalIds) {
			Role r = new Role();
			r.setId(id);
			object.remove(r);
		}
		object.setDefaultRole(null);
		repository.flush();
		if(StringUtils.isNotBlank(ids)) {
			List<String> newIds = Arrays.asList(ids.split(","));			
			//增加新提交的所在部门关系
			for(String id:newIds) {
				Role r = new Role();
				r.setId(id);
				entity.add(r);
				entity.setDefaultRole(r);
			}
		}
		return repository.saveAndFlush(entity);
	}
}
